package com.gitee.liuzhi.design.create;

import org.apache.commons.lang3.StringUtils;

/**
 * @Author liuzhi
 * @Date 2023/8/26 09:38
 * @Version 1.0
 * @Description 工厂模式 Factory Pattern
 * <p>
 * 工厂模式在创建对象时不会对客户端暴露创建逻辑, 并且是通过使用一个共同的接口来指向新创建的对象
 * <p>
 * 优点
 * 1. 调用者想创建一个对象, 只要知道其名称就可以了
 * 2. 扩展性高, 如果想增加一个产品, 只要扩展一个工厂类就可以
 * 3. 屏蔽产品的具体实现, 调用者只关心产品的接口
 * <p>
 * 缺点
 * 1. 每次增加一个产品时, 都需要增加一个具体类和对象实现工厂, 使得系统中类的个数成倍增加
 * 在一定程度上增加了系统的复杂度, 同时也增加了系统具体类的依赖
 */
public class FactoryPattern {

    public static void main(String[] args) {
        CatFactory catFactory = new CatFactory();
        Car audi = catFactory.getCar("audi");
        Car benz = catFactory.getCar("benz");
        Car bmw = catFactory.getCar("bmw");
        audi.createCar();
        benz.createCar();
        bmw.createCar();
    }


    public static class CatFactory {

        public Car getCar(String carName) {
            if (StringUtils.isEmpty(carName)) {
                return null;
            }
            Car car;
            switch (carName) {
                case "audi":
                    car = new Audi();
                    break;
                case "benz":
                    car = new Benz();
                    break;
                case "bmw":
                    car = new Bmw();
                    break;
                default:
                    car = null;
            }
            return car;
        }

    }


    public interface Car {
        void createCar();
    }

    public static class Audi implements Car {

        @Override
        public void createCar() {
            System.out.println("奥迪车");
        }
    }

    public static class Benz implements Car {

        @Override
        public void createCar() {
            System.out.println("奔驰车");
        }
    }

    public static class Bmw implements Car {

        @Override
        public void createCar() {
            System.out.println("宝马车");
        }
    }

}
